package com.cskaoyan.javase.array._1basic._1initialization;

/**
 * 数组的初始化
 * 声明完成一个数组后，该数组仍然不能使用，还缺少一个初始化（initialization）的过程，类似变量初始化（赋值）
 * 对于变量而言，初始化是在内存中开辟空间并赋值的过程，对于数组而言，也是类似的过程。
 *
 * 数组要开辟一片连续的空间用来存放数据，然后进行元素赋值，即：
 *      1.我们要告诉需要开辟多少内存空间（数组有多长）
 *      2.数组中的元素要明确它的值（没有值，数组的存储单元也没有意义）
 *
 * 于是(一维)数组的初始化方式,就存在以下两种:
 *  1.静态初始化,直接给出数组中元素的具体取值,数组的个数是确定的,数组长度也是确定的
 *  语法:
 *          数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
 *  静态初始化的语法,有简写形式:
 *          数据类型[] 数组名 = {元素1,元素2,元素3...};
 *          特别注意: 静态初始化的简写形式必须和声明写在一起.
 *
 * 2.动态初始化,指的是只告诉数组的长度,完成数组的初始化
 *  语法:
 *      数据类型[] 数组名 = new 数据类型[数组长度];
 *  思考:
 *      初始化需要明确数组的长度以及元素的取值,但是动态初始化没有给出元素的取值
 *      那么数组中的元素就没有值了吗?
 *      实际上是存在取值的,只不过取值不是程序员给出的,而是由JVM默认给出的
 *      称之为"默认值"
 *
 * 一维数组除了以上两种初始化方式,再也没有别的初始化方式了
 * 典型的错误"动静结合"
 *
 * 静态初始化适合明确知道数组中的元素时使用，它比较简单直接。但是它不够灵活
 * 动态初始化更加灵活，可以先创建数组，然后再赋值。
 *
 * @since 11:45
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 静态初始化一个长度为0的,没有任何元素的int类型空数组
        int[] arr = new int[]{};
        // 静态初始化一个长度为3,元素是1,2,3的int数组
        int[] arr2 = {1, 2, 3};
        // 静态初始化简写形式
        String[] arr3 = {"abc", "123", "666"};
        // 特别注意: 静态初始化的简写形式必须和声明写在一起
        // arr3 = {"123"};

        // 动态初始化数组
        int[] arr4 = new int[0];
        int[] arr5 = new int[3];

        // "动静结合"是错误的
        // int[] arr6 = new int[3]{1,2,3};

    }
}
